package com.deco.logic.sys;

import com.deco.domain.vo.fix.FixGeneralDspVo;
import com.free.common.vo.PageResponseVo;
import com.free.common.vo.PageSearchVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

import com.deco.dao.delegate.product.IDicVehicleDao;
import com.deco.dao.delegate.product.IPartGroupDao;
import com.deco.dao.delegate.product.IPartsInfoDao;
import com.deco.dao.delegate.sys.ICmsRoleDao;
import com.deco.domain.vo.product.DicVehicleVo;
import com.deco.domain.vo.product.PartGroupVo;
import com.deco.domain.vo.product.PartsInfoVo;
import com.deco.domain.vo.sys.CmsRoleVo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
@Component
public class CmsRoleLogic {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/
    
    @Autowired
    ICmsRoleDao cmsRoleDao;

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/

	@Cacheable(value = "cacheRoles",key = "#id")
	public CmsRoleVo getCmsRole(int id) {
		CmsRoleVo cmsRoleVo = new CmsRoleVo();
		cmsRoleVo.setId(id);
		return cmsRoleDao.selectOne(cmsRoleVo);
	}


	@CacheEvict(value = {"cacheRoles","cacheMenus"},allEntries=true)
	public void create(CmsRoleVo cmsRoleVo) {
		cmsRoleDao.add(cmsRoleVo);
		
	}

	@CacheEvict(value = {"cacheRoles","cacheMenus"},allEntries=true)
	public void update(CmsRoleVo cmsRoleVo) {
		cmsRoleDao.update(cmsRoleVo);
	}

	@Cacheable(value = "cacheRoles")
	public List<CmsRoleVo> getAll(){
		CmsRoleVo cmsRole = new CmsRoleVo();
		return cmsRoleDao.selectList(null, StringUtils.EMPTY);
	}

	@CacheEvict(value = {"cacheRoles","cacheMenus"},allEntries=true)
	public void delete(int id) {
		cmsRoleDao.delete(id);
	}



	public List<CmsRoleVo> getRoleInfos(String roles){
		List<String> menuRoles = Arrays.asList(StringUtils.split(roles,",")).stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
		if(menuRoles == null || menuRoles.size() == 0){
			return null;
		}
		// 获得全部角色
		List<CmsRoleVo> roleVos = getAll();
		// 获得用户对应的角色信息
		roleVos = roleVos.stream().filter(x->{
			return menuRoles.contains(String.valueOf(x.getId()));
		}).collect(Collectors.toList());
		return roleVos;
	}

	public List<CmsRoleVo> getActivedRoles(String roles){
		List<String> roleIds = Arrays.asList(StringUtils.split(roles,",")).stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
		// 获得全部角色
		List<CmsRoleVo> roleVos = getAll();
		if(roleIds == null || roleIds.size() == 0){
			return roleVos;
		}
		roleVos.forEach(x->{
			if(roleIds.contains(x.getId().toString())){
				x.setActive(true);
			}
		});
		return roleVos;
	}

	@Cacheable(value = "cacheRoles",key="#roles")
	public List<String> getRoleMenus(String roles){
		List<CmsRoleVo> roleVos = getRoleInfos(roles);
		if(roleVos == null || roleVos.size() == 0){
			return null;
		}

		// 根据角色信息获得菜单ID
		List<String> menuIds = new ArrayList<>();
		roleVos.forEach(x->{
			Arrays.asList(StringUtils.split(x.getMenus(),",")).stream().forEach(y->{
				if(StringUtils.isNotEmpty(y)){
					if(!menuIds.contains(y)){
						menuIds.add(y);
					}
				}
			});
		});
		return menuIds;
	}

	public PageResponseVo<CmsRoleVo> selectPageInfoByCmsRole(PageSearchVo<CmsRoleVo> condition){
		return cmsRoleDao.selectPageInfoByCmsRole(condition.getConditionVo(), condition.getCurrentNo(), condition.getLength());
	}

    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
}
